<?php
/**
 * Page gestion des ue
 * Permet l'affichage, l'ajout, la suppression et la modification d'une ue.
 *
 * @category actions
 * @package administration
 *
 * @author M.CASTANHEIRO, M.MEUNIER, O.PATTE, C.PORTEMER, R.THERY-HERMAIN
 * @version 1.0
 */
class ueAction extends shAction {
    /**
     * Fonction appellée automatiquement pour toutes les requêtes de l'action
     */
    public function init() {
	$this->setTitle('Gestion des Ues');
	$this->addAriane(shRequest::link('administration'), 'Administration');
    }

    /**
     * Execute la méthode par défaut pour l'action ue
     */
    public function execute() {
	// Récupération des batiments connus
	$ues = shSGBD::select ('SELECT ue.id, ue.intitule FROM ue ORDER BY ue.intitule ASC');
	$this->assign('ues',$ues);
    }

    /**
     * Modification d'une ue
     * @param <integer> Identifiant de l'ue à modifier
     */
    public function executeEdit($id_ue) {
	$this->setTitle('Modification d\'une UE');
	$this->addAriane(shRequest::link('administration', 'ue'), 'Gestion des ues');

	// On récupère le profil
	if ( !($ue = shSGBD::selectOne(
	'SELECT ue.id, ue.intitule, ue.couleur FROM ue WHERE id=?'
	,array($id_ue))) ) {
	    throw new Exception('L\'UE demandée n\'existe pas');
	    return false;
	}

	$formulaire = new shFormulaire;
	$formulaire->setSubmitText('Modifier cette ue');

	// Intitulé de l'ue
	shField::text('Intitulé')
		->setValue($ue->intitule)
		->appendTo($formulaire);
	// Le champ couleur
	shField::color('Couleur')
		->setValue($ue->couleur)
		->appendTo($formulaire);
	// Champ pour selectionner les type d'ue associé
	$multi = shField::MULTIBOX('Type d\'enseignement')
		->appendTo($formulaire);

	// On rempli le multi avec tout les type d'ue
	$types = shSGBD::select('SELECT id,intitule FROM type_enseignement ORDER BY intitule ASC');
	foreach ($types as $type) {
	    $multi->addOption($type->id, $type->intitule);
	}

	// On détermine ceux que l'on a déja selectionné
	$typesSelected = shSGBD::select('SELECT id_type_enseignement FROM enseignement WHERE id_ue=:id_ue',
		array(':id_ue'=>$ue->id));
	$typesSelectedTab = array();
	foreach ( $typesSelected AS $typeSelected ) {
	    $typesSelectedTab[] = $typeSelected->id_type_enseignement;
	}
	$multi->setValue($typesSelectedTab);

	// On crée un multi pour lier l'ue aux enseignants
	$multiEns = shField::multibox('Enseignant(s) lié(s)')->setRequired(false)->appendTo($formulaire);
	// On récupère la liste des enseignant
	$enseignants = shSGBD::select('SELECT id,nom,prenom FROM enseignant ORDER BY nom,prenom ASC');
	foreach($enseignants as $enseignant){
	    $multiEns->addOption($enseignant->id,$enseignant->nom . ' ' . $enseignant->prenom);
	}
	// On récupère les enseignants déja selectionnés
	$EnsSelected = shSGBD::select('SELECT id_enseignant FROM enseigner WHERE id_ue=?', array($id_ue));
	$idEns = array();
	foreach ($EnsSelected as $ens) {
	    $idEns[] = $ens->id_enseignant;
	}
	$multiEns->setValue($idEns);

	$formulaire->setCheck(function($formulaire) use ($ue) {
		    if (!$formulaire->isError()) {
			// On vérifie qu'on a pas le même intitulé qui existe
			$salle = shSGBD::selectOne('SELECT count(ue.id) AS count '.
				'FROM ue WHERE intitule=? AND id!=? ',
				array ($formulaire->getField('Intitulé')->getValue(),$ue->id));
			if ($salle->count > 0) {
			    $formulaire->getField('Intitulé')->setError('Une autre ue possède le même intitulé');
			}
		    }
		})
	;

	$formulaire->setSubmit(function($formulaire) use ($ue,$EnsSelected,$typesSelected) {
		    // On modifie l'ue
		    shSGBD::update('UPDATE ue SET intitule=:intitule, couleur=:couleur WHERE id=:id',
			    array( ':intitule' => $formulaire->getField('Intitulé')->getValue(),
			    ':couleur' => $formulaire->getField('Couleur')->getValue(),
			    ':id' => $ue->id));

		    /*// On retire les anciens liens aux enseignements
		    //shSGBD::delete('DELETE FROM enseignement WHERE id_ue=:id_ue', array ('id_ue'=>$ue->id));
		    // On crée les nouveaux liens
		    foreach ( $formulaire->getField('Type d\'enseignement')->getValue() AS $idTypeUe) {
			shSGBD::insert('INSERT INTO enseignement(id_ue,id_type_enseignement) '.
				'VALUES(:id_ue, :id_type_enseignement) ',
				array(':id_ue' => $ue->id,
				':id_type_enseignement' => $idTypeUe));
		    }*/

		    // On vérifie les type d'enseignement à ajouter
		    foreach ($formulaire->getField('Type d\'enseignement')->getValue() AS $typeEns){
			$flag = false;
			foreach($typesSelected as $typeSelected){
			    if ($typeEns == $typeSelected->id_type_enseignement){
				$flag = true;
			    }
			}
			if ($flag == false){
			    shSGBD::insert('INSERT INTO enseignement(id_ue,id_type_enseignement) '.
				'VALUES(?,?) ',
				array($ue->id,$typeEns));
			}
		    }
		    
		    // On vérifie les types d'enseignement à supprimer
		    foreach($typesSelected as $typeSelected){
			$flag = false;
			foreach ($formulaire->getField('Type d\'enseignement')->getValue() AS $typeEns){
			     if ($typeEns == $typeSelected->id_type_enseignement){
				$flag = true;
			    }
			}
			if ($flag == false){
			    // Effacer un enseignement a un impact sur
			    //	-   Groupe
			    //	-   Séance
			    //	    - Mutualiser
			    //	    - Participer

			    // On récupère les enseignements à effacer
			    $enseignements = shSGBD::select('SELECT id FROM enseignement '.
				    'WHERE id_ue=? '.
				    'AND id_type_enseignement=?', array ($ue->id,$typeSelected->id_type_enseignement));

			    // Pour chaque enseignement on supprime groupe
			    foreach ($enseignements as $enseignement){
				shAction::call('administration','groupe','delete',array($enseignement->id));
				// On s'occupe des séances
				$seances = shSGBD::select('SELECT id FROM seance WHERE id_enseignement=?',array($enseignement->id));
				foreach ($seances as $seance){
				    shSGBD::delete('DELETE FROM mutualiser WHERE id_seance=?', array($seance->id));
				    shSGBD::delete('DELETE FROM participer WHERE id_seance=?', array($seance->id));
				}
				shSGBD::delete('DELETE FROM seance WHERE id_enseignement=?',array($enseignement->id));
			    }
			    shSGBD::delete('DELETE FROM enseignement WHERE id_ue=:id_ue', array ('id_ue'=>$ue->id));
			}
		    }

		    // On vérifie les enseignants à ajouter
		    foreach ($formulaire->getField('Enseignant(s) lié(s)')->getValue() AS $ens ) {
			$flag = false;
			foreach ($EnsSelected as $ensSelect) {
			    if ($ens == $ensSelect->id_type_enseignement) {
				$falg = true;
			    }
			}
			if ($flag == false) {
			    // On ajoute
			    shSGBD::insert('INSERT INTO enseigner(id_enseignant,id_ue) '.
				    'VALUES (?,?)', array($ens,$ue->id));
			}
		    }

		    // On vérifie les ues a supprimer
		    foreach ($EnsSelected as $ensSelect) {
			$flag = false;
			foreach ($formulaire->getField('Enseignant(s) lié(s)')->getValue() AS $ens ) {
			    if ($ens == $ensSelect->id_enseignant) {
				$flag = true;
			    }
			}
			if ($flag == false) {
			    // On ajoute
			    shSGBD::delete('DELETE FROM enseigner '.
				    'WHERE id_enseignant=? AND id_ue=?', array($ensSelect->id_enseignant,$ue->id));
			}
		    }


		    shAction::redirect('administration','ue');
		})

	;

	$this->assign('formulaire', $formulaire);
    }


    /**
     * Création d'une ue
     */
    public function executeCreate() {
	$this->setTitle('Ajout d\'une UE');
	$this->addAriane(shRequest::link('administration', 'ue'), 'Gestion des ues');

	$formulaire = new shFormulaire;
	$formulaire->setSubmitText('Ajouter cette ue');

	// Intitulé de l'ue
	shField::text('Intitulé')->appendTo($formulaire);
	// champ couleur
	shField::color('Couleur')->appendTo($formulaire);
	// Champ pour selectionner les type d'ue associé
	$multi = shField::MULTIBOX('Type d\'enseignement')
		->appendTo($formulaire);

	// On rempli le multi avec tout les type d'ue
	$types = shSGBD::select('SELECT id,intitule FROM type_enseignement ORDER BY intitule ASC');
	foreach ($types as $type) {
	    $multi->addOption($type->id, $type->intitule);
	}

	// On crée un multi pour lier l'ue aux enseignants
	$multiEns = shField::multibox('Enseignant(s) lié(s)')->setRequired(false)->appendTo($formulaire);
	// On récupère la liste des enseignant
	$enseignants = shSGBD::select('SELECT id,nom,prenom FROM enseignant ORDER BY nom,prenom ASC');
	foreach($enseignants as $enseignant){
	    $multiEns->addOption($enseignant->id,$enseignant->nom . ' ' . $enseignant->prenom);
	}

	$formulaire->setCheck(function($formulaire) {
		    if (!$formulaire->isError()) {
			// On vérifie qu'on a pas le même intitulé qui existe
			$salle = shSGBD::selectOne('SELECT count(ue.id) AS count '.
				'FROM ue '.
				'WHERE intitule=:intitule',
				array (':intitule'=>$formulaire->getField('Intitulé')->getValue()));
			if ($salle->count > 0) {
			    $formulaire->getField('Intitulé')->setError('Une autre ue possède le même intitulé');
			}
		    }
		})
	;

	$formulaire->setSubmit(function($formulaire) {
		    // On crée le nouveau profil
		    $idUe = shSGBD::insert('INSERT INTO ue (intitule,couleur) VALUES (:intitule,:couleur) ',
			    array( ':intitule' => $formulaire->getField('Intitulé')->getValue(),
			    ':couleur' => $formulaire->getField('Couleur')->getValue()));

		    // On le lie a ses types d'ue
		    foreach ( $formulaire->getField('Type d\'enseignement')->getValue() AS $idTypeUe) {
			shSGBD::insert('INSERT INTO enseignement(id_ue,id_type_enseignement) '.
				'VALUES(:id_ue, :id_type_enseignement) ',
				array(':id_ue' => $idUe,
				':id_type_enseignement' => $idTypeUe));
		    }

		    foreach ( $formulaire->getField('Enseignant(s) lié(s)')->getValue() AS $enseignant ) {
			// On insert dans assister les ues choisies
			shSGBD::insert('INSERT INTO enseigner(id_enseignant,id_ue) '.
				'VALUES (?,?)', array($enseignant,$idUe));
		    }

		    shAction::redirect('administration','ue');
		})
	;

	$this->assign('formulaire', $formulaire);
    }

    /**
     * Efface une ue passé en paramètre
     * @param <integer> Idenfiant de l'ue à supprimer
     */
    public function executeDelete($_id_ue) {
	$this->setTitle('Suppression d\'une ue');

	// Plusieurs tables sont impactées avec des sous tables
	//  assister
	//
	//  enseignement
	//	groupe
	//	seance
	//	    mutualiser
	//	    participer
	//
	//  enseigner

	// Suppresion des données de la table assister
	shSGBD::delete('DELETE FROM assister where id_ue=?', array($_id_ue));

	// Suppresion des données de la table enseigner
	shSGBD::delete('DELETE FROM enseigner where id_ue=?', array($_id_ue));

	// On récupere tous les enseignements qui seront impactés par l'effacement
	$enseignements = shSGBD::select('SELECT id FROM enseignement WHERE id_ue=?', array($_id_ue));
	if (!empty($enseignements)) {
	    $idEnseign = array();
	    foreach ($enseignements as $enseignement) {
		$idEnseign[] = $enseignement->id;
	    }

	    //  On a besoin des enseignements dans groupe et séance
	    //  On les recupèrent avant de les effacer
	    //	Partie Groupe
	    $groupes = shSGBD::select('SELECT id FROM groupe '.
		    'WHERE id_enseignement IN (?'.str_repeat(',? ', sizeof($idEnseign) - 1).') ',$idEnseign);
	    // Pour chaque groupe on execute le delete propre au groupe
	    foreach ($groupes as $groupe) {
		$this->call('groupe','delete',array($groupe->id));
	    }

	    // Partie Seance
	    $seances = shSGBD::select('SELECT id FROM seance '.
		    'WHERE id_enseignement IN (?'.str_repeat(',? ', sizeof($idEnseign) - 1).') ',$idEnseign);

	    if (!empty($seances)) {
		$idSeances = array();
		foreach ($seances as $seance) {
		    $idSeances[] = $seance->id;
		}
		//	+   On supprime toutes traces des séances dans mutualiser et participer
		//	+   On supprime toutes les séances
		shSGBD::delete('DELETE FROM mutualiser WHERE id_seance IN (?'.str_repeat(',? ', sizeof($idSeances) - 1).') ',$idSeances);
		shSGBD::delete('DELETE FROM participer WHERE id_seance IN (?'.str_repeat(',? ', sizeof($idSeances) - 1).') ',$idSeances);
		shSGBD::delete('DELETE FROM seance WHERE id IN (?'.str_repeat(',? ', sizeof($idSeances) - 1).') ',$idSeances);
	    }
	}

	//  -	On termine cette partie par la suppression des enseignements
	shSGBD::delete('DELETE FROM enseignement WHERE id_ue=?', array($_id_ue));

	// Suppression de l'UE
	shSGBD::delete('DELETE FROM ue WHERE id=?',array($_id_ue));

	// On retourne sur la page
	shAction::redirect('administration','ue');
    }
}
?>